﻿//#define _CRT_SECURE_NO_WARNINGS
//#include <stdio.h>
//#include <string.h>
//#include <math.h>

#include "common.h"

void study10()
{
	/* 找出 C 语言中的字符串数组和字符串长度 */
	char a[] = "abcdef";  // 字符串定义方式，也可以写为{"a", "b", "c", "d", "e", "f"}，打印第一个为a
	int i = 0;
	for (i = 0; i < 10; i++) {
		printf("%s\n", &a);  // 要取得地址
	}
	// 否则打印输出错误
	printf("打印一些字符，输出错误\n");
	//aircraft();
	// 输入两个数，并调用
	//printf("输入两个数\n");
	//int n = 0;
	//int m = 0;
	//int t1 = scanf("%d %d", &n, &m);
	//max_tow_value2(n, m);
	//转化x与y的位置
	//printf("y的值为：%d\n", x_to_y()); // 函数还没写
	// / 计算机中的位运算符：<< >> & | ^ ~
	float s1 = 7 / 2; // -> 3
	float s2 = 7 / 2.0; // -> 3.5
	int s3 = 7 % 2; // -> 1 取模运算：取模运算符%只能对整数进行操作，取模运算的结果是两个操作数除以同一个数所得的余数
	printf("%.2f\n%.2f\n%d\n", s1, s2, s3); // 保留两位小数
	printf("位运算符\n");
	// 左移右移
	int w1 = 3 >> 2; // -> 0 右移
	int w2 = 3 << 2; // -> 12 左移
	printf("%d\n%d\n", w1, w2);
	int w3 = 3 & 5; // -> 1 与
	int w4 = 3 | 5; // -> 7 或
	int w5 = 3 ^ 5; // -> 6 异或：相同为0，不同为1
	printf("%d\n%d\n%d\n", w3, w4, w5);
	// 赋值运算符： += -= *= /= |= &= ^= <<= >>= %=
	int v1 = 3;
	int v2 = 3;
	int v3 = 3;
	v1 *= 5; // -> v1 = v1 * 5 = 15
	v2 ^= 5; // -> v2 = v2 ^ 5 = 6
	v3 <<= 3; // -> v3 = v3 << 3 = 24
	printf("%d\n%d\n%d\n", v1, v2, v3);
	// 也有的目标：学习的函数
	//monocular();
	// 逻辑运算符：> < >= <= !=(!=) ==
	// 逻辑与：&& 逻辑或：|| 逻辑非：!
	printf("逻辑运算符\n");
	int fg1 = 0;
	int fg2 = 100;
	if (fg1 && fg2) // 如果 fg1 和 fg 2 都为真时，执行if内的语句
	{
		printf("fg1和fg2都为真时执行if内的语句\n");
	}
	else if (fg1 || fg2) // 如果 fg1 和 fg2 有一个为真时，执行else if内的语句
	{
		printf("fg1和fg2有一个为真时执行if内的语句\n");
	}
	else
	{
		printf("fg1 和 fg2 都为假时执行else内的语句\n");
	}
	// 也有的条件：?: 三目运算符
	int e1 = 5;
	int e2 = 12;
	printf("三目运算符的结果为%d\n", e1 > e2 ? e1 - e2 : e2 - e1); // 实际输出的结果是7
	// 三目运算符还可以
	// 表达式1：e1=e3-5 表达式2：e2=e2+2 表达式3：e1=e1-10
	// 表达式的规则：先执行表达式1，如果表达式1为真，则执行表达式2；如果表达式1为假，则执行表达式3；然后返回表达式2或表达式3的结果
	// 表达式的格式：(表达式1, 表达式2, 表达式3)
	int e3 = 8;// 表达式的规则：如果表达式1为真，则执行表达式2；如果表达式1为假，则执行表达式3；然后返回表达式2或表达式3的结果
	int e4 = (e3 -= 5, e2 += 2, e1 -= 10, e1 + e2 + e3); // e4的表达式为 12 注意取值
	printf("e4的表达式为%d\n", e4);
	// 访问数组：[] 数组下标， () 函数调用， . 结构体成员访问， -> 指针成员访问
	printf("访问数组\n");
	int y_arr[11] = { 1,2,3,4,5,6,7,8,9,10,0 };
	printf("数组中的第4个值为：%d\n", y_arr[3]);
	// 注意：数组必须赋初值，也可以改变数组中的初值： y_arr[3] = 300  但是y_arr的第4个值 4 变为300
	int n_b = 3;
	y_arr[n_b] = 300; // 跨越数组
	printf("改变数组中的第4个值为：%d\n", y_arr[3]);
	char yy[10] = { 'a', 'b', 'c', 'd', 'e', 'f', 'g' };
	printf("yy的第4个字符为：%s\n", &yy[3]);
	int l = 0;
	printf("yy的长度为：%zu\n", strlen(yy)); // -> 7 注意：计算长度未赋初值字符串，不包含'\0'标识
	for (l = 0; l < strlen(yy); l++)
	{
		printf("%s\t", &yy[l]); // %s 取得地址，打印字符串   注意 %d 打印字符的ASCII
	}
	// 记住，C语言中的位移没有越界检测
	// 通过 pow(double x, double y) 实现 x 的 y 次方
	printf("\n%lf\n", pow(2, 8));
	//return 0;
}

//说明：EOF文件的结束标志：end of file，转换字符为 -1
